package com.yhm.pagination;

/**
 * 分页处理类,服务端计算代码
 * 传入总记录数,和当前页码,每页记录数.计算其他的值
 * 默认当前页为1，每页大小为2,排序类型为 0
 * @author 杨华明
 * @version 1.0.0
 */
public class PageUtil {
	
	private Integer totalCount=0; //总记录数
	private Integer currentPage=1;//当前需要显示的页数.对应显示的页号
	private Integer pageSize=2;   //分页大小
	private Integer orderType=0;  //排序类型(默认自然排序)

	public PageUtil(Long totalCount, Long currentPage, Long pageSize){
		super();
		this.totalCount = totalCount==null?0:totalCount.intValue();
		this.currentPage = currentPage==null?0:currentPage.intValue();
		this.pageSize = pageSize==null?0:pageSize.intValue();
	}
	public PageUtil(Integer totalCount, Integer currentPage, Integer pageSize) {
		super();
		this.totalCount = totalCount==null?0:totalCount;
		this.currentPage = currentPage==null?0:currentPage;
		this.pageSize = pageSize==null?0:pageSize;
	}
	public PageUtil(Long totalCount, Long currentPage){
		this(totalCount,currentPage,2L);
	}
	public PageUtil(Integer totalCount, Integer currentPage) {
		this(totalCount,currentPage,2);
	}
	public PageUtil(Long totalCount){
		this(totalCount,1L);
	}
	public PageUtil(Integer totalCount) {
		this(totalCount,1);
	}
	public PageUtil() {
		this(0);
	}
	/**用于分页的总记录数
	 * 也是计算总页数和偏移量的依据
	 **/
	public Integer getTotalCount() {
		return totalCount==null||totalCount<0?0:totalCount;
	}
	/**用于分页的总记录数
	 * 也是计算总页数和偏移量的依据
	 * 一般必须先设置总记录数。否则可能会造成其他参数错误
	 **/
	public void setTotalCount(Integer totalCount) {
		this.totalCount = totalCount==null||totalCount<0?0:totalCount;
	}
	/**用于分页的总记录数
	 * 也是计算总页数和偏移量的依据
	 * 一般必须先设置总记录数。否则可能会造成其他参数错误
	 **/
	public void setTotalCount(Long totalCount){
		Long tc=totalCount==null||totalCount<0?0:totalCount;
		this.totalCount=tc.intValue();
	}
	/**当前要显示的页号(从1开始).前台传入)
	 * 当前页不能小于1和大于总页数
	 * ****再获取当前页之前，必须先设置TotalCount/PageSize*/
	public Integer getCurrentPage() {
		return (currentPage==null||currentPage<1)?1:(currentPage>getTotalPage()&&getTotalPage()>0?getTotalPage():currentPage);
	}
	/**当前要显示的页号(从1开始).前台传入*/
	public void setCurrentPage(Integer currentPage) {
		this.currentPage = (currentPage==null||currentPage<1?1:currentPage);
	}
	/**每一页显示的记录条数.必须大于等于1*/
	public Integer getPageSize() {
		return pageSize==null||pageSize<1?1:pageSize;
	}
	/**每一页显示的记录条数.必须大于等于1*/
	public void setPageSize(Integer pageSize) {
		this.pageSize = (pageSize==null||pageSize<1?1:pageSize);
	}
	/**记录显示的开始位置limit ?,? 中的第一个参数*/
	public Integer getOffset() {
		return (getCurrentPage()-1)*getPageSize();
	}
	/**计算总页数.总记录数除以每页行数
	 * 不足一页算一页*/
	public Integer getTotalPage(){
		return (getTotalCount()%getPageSize()==0)?getTotalCount()/getPageSize():getTotalCount()/getPageSize()+1;
	}
	/**获取首页页号**/
	public Integer getFirstPage(){
		return 1;
	}
	/**获取末页页号**/
	public Integer getLastPage(){
		return getTotalPage()>0?getTotalPage():1;
	}
	/**获取前一页页号**/
	public Integer getPrevPage(){
		return  getCurrentPage()-1<1?1:getCurrentPage()-1;
	}
	/**获取后一页页号**/
	public Integer getNextPage(){
		return getCurrentPage()+1 > getTotalPage()&&getTotalPage()>0?getTotalPage():getCurrentPage()+1;
	}
	/**当前页(同属性CurrentPage)
	 * 主要是保证和一些工具兼容
	 **/
	public Integer getPage(){
		return getCurrentPage();
	}
	/**当前页(同属性CurrentPage)
	 *主要是保证和一些工具兼容*/
	public void setPage(Integer page){
		setCurrentPage(page);
	}
	/**当前页(同属性CurrentPage)
	 *主要是保证和一些工具兼容*/
	public void setPageNumber(Integer no){
		setCurrentPage(no);
	}
	/**当前页(同属性CurrentPage)
	 *主要是保证和一些工具兼容*/
	public Integer getPageNumber(){
		return getCurrentPage();
	}
	/**只有1页*/
	public boolean onlyOnePage(){
		return getTotalPage()==1;
	}
	@Override
	public String toString() {
		return "PageUtil [getTotalCount()=" + getTotalCount()
				+ ", getCurrentPage()=" + getCurrentPage() + ", getPageSize()="
				+ getPageSize() + ", getOffset()=" + getOffset()
				+ ", getTotalPage()=" + getTotalPage() + ", getFirstPage()="
				+ getFirstPage() + ", getLastPage()=" + getLastPage()
				+ ", getPrevPage()=" + getPrevPage() + ", getNextPage()="
				+ getNextPage() + "]";
	}
	/**排序方式,一般是由客户使用时自定义
	 * 比如为0 表示按创建时间排序，为1按操作员排序等*/
	public Integer getOrderType() {
		return orderType==null?0:orderType;
	}
	/**排序方式,一般是由客户使用时自定义
	 * 比如为0 表示按创建时间排序，为1按操作员排序等*/
	public void setOrderType(Integer orderType) {
		this.orderType = orderType==null?1:orderType;
	}
}
